/**
 * 
 */
package ar.com.gepp.torneo.parsers;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import ar.com.gepp.torneo.entidades.impl.Equipo;
import ar.com.gepp.torneo.entidades.impl.Fecha;
import ar.com.gepp.torneo.entidades.impl.Fixture;
import ar.com.gepp.torneo.entidades.impl.Partido;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;

/**
 * @author gpidote
 * 
 */
public class ParserFixture {

	/**
	 * Devuelve el fixture para una lista definida de equipos y el archivo a parsear.
	 * @param file
	 * @param equipos
	 * @param idaVuelta
	 * @return
	 * @throws Exception
	 */
	public static Fixture parserXmlToFixture(File file, List<Equipo> equipos,
			Boolean idaVuelta) throws Exception {

		XStream xstream = new XStream(new StaxDriver());
		xstream.alias("fixture", Fixture.class);
		xstream.alias("fecha", Fecha.class);
		xstream.alias("partido", Partido.class);
		xstream.alias("local", Equipo.class);
		xstream.alias("visitante", Equipo.class);

		InputStream input = new FileInputStream(file);

		Fixture inicial = (Fixture) xstream.fromXML(input);
		inicial.setActual(0);

		List<Fecha> vuelta = new ArrayList<Fecha>();

		for (Fecha fecha : inicial.getFechas()) {
			fecha.setPlayed(false);
			for (Partido partido : fecha.getPartidos()) {
				partido.setLocal(equipos.get(partido.getLocal().getIdEquipo()));
				partido.setVisitante(equipos.get(partido.getVisitante()
						.getIdEquipo()));
				partido.setGolLocal(0);
				partido.setGolVisitante(0);
				partido.setPlayed(false);
			}
		}
		if (idaVuelta) {
			for (Fecha fecha : inicial.getFechas()) {
				Fecha fechaVuelta = new Fecha();
				fechaVuelta.setPlayed(false);
				List<Partido> partidosVuelta = new ArrayList<Partido>();
				for (Partido partido : fecha.getPartidos()) {
					Partido vueltaPartido = new Partido();
					vueltaPartido.setLocal(partido.getVisitante());
					vueltaPartido.setVisitante(partido.getLocal());
					vueltaPartido.setGolLocal(0);
					vueltaPartido.setGolVisitante(0);
					vueltaPartido.setPlayed(false);
					partidosVuelta.add(vueltaPartido);
					
				}
				fechaVuelta.setPartidos(partidosVuelta);
				vuelta.add(fechaVuelta);
			}
			List<Fecha> total = inicial.getFechas();
			total.size();
			
			if (!total.addAll(vuelta)) {
				throw new Exception(
						"ParseFixture: no se puede crear los partidos de vuelta");
			}
			inicial.setFechas(total);	
		}
		
		return inicial;
	}

}
